package com.zfh.demo.blog.config;

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;

//事务管理
@EnableTransactionManagement
@Configuration // 配置类
public class MyBatisPlusConfig {
    /**
     *  乐观锁的作用：
     *          乐观锁的主要作用是为了解决事务并发带来的问题。
     *          相对于悲观锁而言，乐观锁机制采取了更加宽松的加锁机制。
     *   乐观锁的工作原理：
     *          读取出数据时，将此版本号一同读出，之后更新时，对此版本号加一。
     *          此时，将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对，
     *          如果提交的数据版本号大于数据库表当前版本号，则予以更新，否则认为是过期数据。
     *
     * @return
     */
    // 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return  new OptimisticLockerInterceptor();
    }

    // 分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }

    // 逻辑删除组件
    @Bean
    public ISqlInjector sqlInjector(){
        return new LogicSqlInjector();
    }

    /**
     * SQL执行效率插件
     */
    @Bean
    @Profile({"dev","test"}) // 设置 dev test 环境开启，保证我们的效率
    public PerformanceInterceptor performanceInterceptor(){
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(100); // ms设置sql执行的最大时间，如果超过了则不执行
        performanceInterceptor.setFormat(true); // 是否格式化代码
        return performanceInterceptor;
    }

}
